home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / oh!.2hd / OH!DEN_B.LZH / TOOLS / DC_VIEW / NEXTFILE.C < prev   
Text File  |  1995-03-20  |  14KB  |  516 lines

  1. /******************************************************************************
  2.  *    nextfile.c:    下層テキストのロード処理
  3.  ******************************************************************************
  4.  *
  5.  *
  6.  */
  7. #include <zmusic.h>
  8. #include <direct.h>
  9. #include <stdio.h>
  10. #include <iocslib.h>
  11. #include <ctype.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <stat.h>
  15. #include <io.h>
  16. #include <jfctype.h>
  17. #include <doslib.h>
  18. #include <direct.h>
  19. #include <event.h>        /* イベントマンを利用するときに必要    */
  20. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  21. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  22. #include <control.h>        /* コントロールマンを利用するときに必要    */
  23. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  24. #include <task.h>        /* タスクマンを利用するときに必要    */
  25. #include "DC.h"            /* このプログラム固有のヘッダファイル    */
  26.  
  27. /******************************************************************************
  28.  *    nextfile():    下層テキストのロード
  29.  ******************************************************************************
  30.  *    引数:    ComVal *pcv    共通変数へのポインタ
  31.  */
  32. void nextfile(ComVal *pcv)
  33. {
  34.     char buff[256],buffm[512],buff2[512];
  35.     char tempfname[90],taskfname[90],comexe[90],execfname[90];
  36.     LPoint mpos;
  37.     int comline,err = 0,i,res;
  38.     char *txtPt,*comPt;
  39.     int *txtNo;
  40.     FILE *fn;
  41.     void **pcm;
  42.     char *dmy;
  43.     long fileLen;
  44.     char drv[TS_NAMEMAX],path[TS_NAMEMAX],node[TS_NAMEMAX],ext[TS_NAMEMAX];
  45.     char mdrv[TS_NAMEMAX];
  46.     IcState *icon;
  47.  
  48.     char com[256];
  49.     int comNo;
  50.     char command[90];
  51.     char param[90];
  52.     char destfname[90];
  53.     char docfname[90];
  54.     char newfname[90];
  55.     char docPath[90];
  56.  
  57.     int type;         /* 1:doc,2:pcm,3:opm,4:ede,5:exe,6:cli    */
  58.  
  59.     com[0] = 0;
  60.     path[0] = 0;
  61.     command[0] = 0;
  62.     param[0] = 0;
  63.     destfname[0] = 0;
  64.     docfname[0] = 0;
  65.     newfname[0] = 0;
  66.     docPath[0] = 0;
  67.  
  68.  
  69.     mpos = EMMSLoc();
  70.     comline = pcv->ofset + LOWWORD(mpos) / 12;
  71.  
  72.     if (pcv->Maxline < comline)
  73.         return;
  74.  
  75.     MMHdlLock(pcv->txt);    /* テキストブロックのハンドルをロック */
  76.     MMHdlLock(pcv->txtNo);
  77.  
  78.     txtPt = *(pcv->txt);
  79.     txtNo = *(pcv->txtNo);
  80.  
  81.     txtPt = txtPt + *(txtNo + comline);
  82.  
  83.     if (!strncmp(txtPt, "◎", 2)) {        /* コマンドラインか?    */
  84.         while(strncmp(txtPt, "TYPE=", 5)) {
  85.             if (*txtPt == 13) {
  86.                 err = 1;
  87.                 break;
  88.             }
  89.             txtPt++;
  90.         }
  91.         if (err) return;
  92.         comPt = &buff[0];
  93.         while(*txtPt != 13) {
  94.             *comPt++ = *txtPt++;
  95.         }
  96.         *comPt = 0;
  97.  
  98.         comPt = &buff[0] + 5;
  99.         while(*comPt != 0) {        /*    '/' なんか使うなよ    */
  100.             if (*comPt == '/')
  101.                 *comPt = '\\';
  102.             comPt++;
  103.         }
  104.         comPt = &buff[0] + 5;
  105.  
  106.         if (!strncmp(comPt, "DOC", 3)) {     /* TYPEの設定    */
  107.             type = 1;
  108.         } else if (!strncmp(comPt, "PCM", 3)) {
  109.             type = 2;
  110.         } else if (!strncmp(comPt, "OPM", 3)) {
  111.             type = 3;
  112.         } else if (!strncmp(comPt, "EDE", 3)) {
  113.             type = 4;
  114.         } else if (!strncmp(comPt, "EXE", 3)) {
  115.             type = 5;
  116.         } else if (!strncmp(comPt, "CLI", 3)) {
  117.             type = 6;
  118.         } else {
  119.             type = 99;
  120.         }
  121.  
  122.         comPt = comPt + 3;
  123.         readcom(pcv, comPt, type, path, command, param, destfname, docfname, docPath);
  124.  
  125.         switch(type) {
  126.         case 1:                            /* DOCの場合    */
  127.             strcpy(&(pcv->pastFname[pcv->pastFno][0]),
  128.                              pcv->currentFname);
  129.             pcv->pastofset[pcv->pastFno] = pcv->ofset;
  130.  
  131.             strcpy(&(pcv->pastPath[pcv->pastFno][0]),
  132.                              pcv->currentPath);
  133.             structfname(pcv, path, docfname, pcv->currentFname);
  134.             strcpy(pcv->currentPath, docPath);
  135.  
  136.             if (GetData(pcv, pcv->currentFname)) {
  137.                 pcv->pastFno = pcv->pastFno + 1;
  138.                 CMShine(pcv->btn12Hdl,C_ACTIVE);
  139.                 drawGraph(pcv, 0);
  140.             } else {
  141.                 strcpy(pcv->currentFname, 
  142.                     &(pcv->pastFname[pcv->pastFno][0]));
  143.                 strcpy(pcv->currentPath, 
  144.                     &(pcv->pastPath[pcv->pastFno][0]));
  145.                 pcv->errorCode = 0;
  146.                 return;
  147.             }
  148.             break;
  149.  
  150.         case 2:                            /* PCMの場合    */
  151.             structfname(pcv, path, docfname, tempfname);
  152.             fn = fopen(tempfname, "rb");
  153.             if (fn == NULL) {
  154.                 DMError(D_CONFIRM,"File not found!");
  155.                 return;
  156.             }
  157.  
  158.             if (!pcv->pcmTask) {
  159.                 fseek(fn, -1, SEEK_END);
  160.                 fileLen = ftell(fn);    /* ファイルサイズを求める */
  161.                 fseek(fn, 0, SEEK_SET);
  162.                 pcm =NULL;
  163.                 pcm = MMChHdlNew(fileLen);  /* PCMメモリ確保 */
  164.                 if (pcm == NULL) {
  165.                     DMError(D_CONFIRM | D_RED,
  166.                         "メモリが確保できません!");
  167.                     fclose(fn);
  168.                     return;
  169.                 }
  170.                 MMHdlLock(pcm);
  171.                 fread(*pcm, sizeof(char), (size_t) (fileLen), fn);
  172.                 fclose(fn);
  173.                 MMHdlUnlock(pcm);
  174.                 ADPCMOUT(*pcm, 4*256+3, fileLen);
  175.                 MMHdlDispose(pcm);
  176.             } else {
  177.                 fclose(fn);
  178.                 command[0] = sprintf(&command[1], "%s %s", pcv->pcmOpt, tempfname);
  179.                 pcv->pcmTask = TSFockB(0, 0, pcv->pcmFname, command, 0, execfname);
  180.                 if (pcv->pcmTask < 0) {
  181.                     sprintf(command ,"%s:が見つかりません!", pcv->pcmFname);
  182.                     DMError(D_CONFIRM, command);
  183.                     pcv->pcmTask = 0;
  184.                     return;
  185.                 }
  186.             }
  187.             break;
  188.  
  189.         case 3:                            /* OPMの場合    */
  190.             if (!LOWWORD(zm_ver())) {
  191.                 DMError(D_CONFIRM, "ZMUSIC が常駐していません!");
  192.                 return;
  193.             }
  194.  
  195.             structfname(pcv, path, docfname, tempfname);
  196.             fn = fopen(tempfname, "rt");
  197.             if (fn == NULL) {
  198.                 DMError(D_CONFIRM,"File not found!");
  199.                 return;
  200.             }
  201.  
  202.             if (!pcv->mzTask) {
  203.                 EMEnCross();
  204.                 while(1) {
  205.                     fgets(buffm, 512, fn);    /* 一行読み込み */
  206.                     if (buffm[0] == 0)
  207.                         break;
  208.                     if (!strncmp(strlwr(buffm), 
  209.                             ".adpcm_block_data", 17)) {
  210.                         for(i=17;i<256;i++) {
  211.                             if ((buffm[i] != ' ') &&
  212.                                 (buffm[i] != '=') &&
  213.                                     (buffm[i] != 9))
  214.                                 break;
  215.                         }
  216.                         strsfn(tempfname,drv,path,node,ext);
  217.                         strcpy(mdrv, drv);
  218.                         strcat(mdrv, path);
  219.                         buff2[0] = 0;
  220.                         strncpy(buff2, buffm, 17);
  221.                         buff2[17] = 0;
  222.                         strcat(buff2, " ");
  223.                         strcat(buff2, mdrv);
  224.                         strcat(buff2, "\\");
  225.                         strcat(buff2, &buffm[i]);
  226.                 /*    DMError(D_CONFIRM,buff2);    */    
  227.                         exec_zms(buff2);
  228.                     } else {
  229.                         exec_zms(buffm);
  230.                     }
  231.                 }
  232.                 fclose(fn);
  233.                 EMDeCross();
  234.             } else {
  235.                 fclose(fn);
  236.                 command[0] = sprintf(&command[1], "%s %s", pcv->mzOpt, tempfname);
  237.                 pcv->mzTask = TSFockB(0, 0, pcv->mzFname, command, 0, execfname);
  238.                 if (pcv->mzTask < 0) {
  239.                     sprintf(command ,"%s:が見つかりません!", pcv->mzFname);
  240.                     DMError(D_CONFIRM, command);
  241.                     pcv->mzTask = 0;
  242.                     return;
  243.                 }
  244.                 strcpy(pcv->zmsfname, tempfname);
  245.             }
  246.             pcv->mloadFlag = 1;
  247.             CMShine(pcv->btn10Hdl,C_ACTIVE);
  248.             CMShine(pcv->btn11Hdl,C_ACTIVE);
  249.             break;
  250.  
  251.         case 4:                            /* EDEの場合    */
  252.             strcpy(&(pcv->pastFname[pcv->pastFno][0]),
  253.                              pcv->currentFname);
  254.             pcv->pastofset[pcv->pastFno] = pcv->ofset;
  255.             strcpy(&(pcv->pastPath[pcv->pastFno][0]),
  256.                              pcv->currentPath);
  257.             structfname(pcv, path, destfname, taskfname);
  258.  
  259.             if (!strncmp(command, "PIC", 3) && pcv->picTask) {
  260.                 if (strchr(taskfname, '.') == 0)
  261.                     strcat(taskfname, ".PIC");
  262.                 command[0] = sprintf(&command[1], "%s %s", pcv->picOpt, taskfname);
  263.                 pcv->picTask = TSFockB(0, 0, pcv->picFname, command, 0, execfname);
  264.                 if (pcv->picTask < 0) {
  265.                     sprintf(command ,"%s:が見つかりません!", pcv->picFname);
  266.                     DMError(D_CONFIRM, command);
  267.                     pcv->picTask = 0;
  268.                 }
  269.             }
  270.  
  271.             structfname(pcv, path, docfname, pcv->currentFname);
  272.             strcpy(pcv->currentPath, docPath);
  273.  
  274.             if (GetData(pcv, pcv->currentFname)) {
  275.                 pcv->pastFno = pcv->pastFno + 1;
  276.                 CMShine(pcv->btn12Hdl,C_ACTIVE);
  277.                 drawGraph(pcv, 0);
  278.             } else {
  279.                 strcpy(pcv->currentFname, 
  280.                     &(pcv->pastFname[pcv->pastFno][0]));
  281.                 strcpy(pcv->currentPath, 
  282.                     &(pcv->pastPath[pcv->pastFno][0]));
  283.                 pcv->errorCode = 0;
  284.                 return;
  285.             }
  286.             break;
  287.  
  288.         case 5:                            /* EXE,CLIの場合 */
  289.         case 6:
  290.             if (!strncmp(command, "PIC", 3) && pcv->picTask) {
  291.                 structfname(pcv, path, destfname, taskfname);
  292.                 if (strchr(taskfname, '.') == 0)
  293.                     strcat(taskfname, ".PIC");
  294.                 command[0] = sprintf(&command[1], "%s %s", pcv->picOpt, taskfname);
  295.                 pcv->picTask = TSFockB(0, 0, pcv->picFname, command, 0, execfname);
  296.             }
  297.             break;
  298.  
  299.         }
  300.     }
  301.     MMHdlUnlock(pcv->txtNo);    /* テキストブロックのハンドルをアンロック */
  302.     MMHdlUnlock(pcv->txt);
  303. }
  304.  
  305. int readcom(ComVal *pcv, char *comPt, int type, char *path, char *command, char *param, char *destfname, char *docfname, char *docPath)
  306. {
  307.     int i, comlen, partlen;
  308.     char *doc;
  309.     char buff[90];
  310.  
  311.     *path = 0;
  312.     *command = 0;
  313.     *param = 0;
  314.     *destfname = 0;
  315.     *docfname = 0;
  316.  
  317.     if (*comPt == ';') {                    /* カレントパスの変更    */
  318.         comPt++;
  319.         if (strncmp(comPt, "CD=", 3) == 0) {
  320.             comPt = comPt + 3;
  321.  
  322.             if (*comPt == '\\') {
  323.                 if (!strncmp(pcv->currentFname, pcv->a_drv, strlen(pcv->a_drv)))
  324.                     sprintf(buff, "A:%s", comPt);
  325.                 else
  326.                     sprintf(buff, "B:%s", comPt);
  327.  
  328.                 strcpy(comPt,buff);
  329.             }
  330.  
  331.             i = 0;
  332.             while(1) {
  333.                 if (*(comPt + i) == ':')
  334.                     if (*(comPt + i + 1) != '\\')
  335.                         break;
  336.                 i++;
  337.             }
  338.             strncpy(path, comPt, i);
  339.             path[i] = 0;
  340.             comPt = comPt + i;
  341.  
  342.             if (type == 1 || type == 4)
  343.                 structfname(pcv, path, "", docPath);
  344.  
  345.         } else {
  346.             while(*comPt != ':') {
  347.                 comPt++;
  348.             }
  349.         }
  350.     } else {
  351.         strcpy(docPath, pcv->currentPath);
  352.     }
  353.  
  354.     if (*comPt == ':') {            /* コマンドライン解析        */
  355.         comPt++;
  356.         while(*comPt == '+' || *comPt == '-' || *comPt == '*' || *comPt == ':') {
  357.             comPt++;
  358.         }
  359.  
  360.         if (*comPt == '\\') {
  361.             if (!strncmp(pcv->currentFname, pcv->a_drv, strlen(pcv->a_drv)))
  362.                 sprintf(buff, "A:%s", comPt);
  363.             else
  364.                 sprintf(buff, "B:%s", comPt);
  365.  
  366.             strcpy(comPt,buff);
  367.         }
  368.  
  369.         switch(type) {
  370.             case 1:        /*     DOC,PCM,OPM    */
  371.             case 2:
  372.             case 3:
  373.                 strcpy(docfname, comPt);
  374.                 break;
  375.             case 4:        /*    EDE        */
  376.                 doc = strchr(comPt, ';');
  377.                 if (doc == NULL)
  378.                     break;
  379.  
  380.                 partlen = strlen(comPt) - strlen(doc);
  381.                 strncpy(buff, comPt, partlen);
  382.                 buff[partlen] = 0;
  383.                 apartcom(pcv, buff, command, param, destfname);
  384.                 doc++;
  385.                 if (*doc == '\\') {
  386.                     if (!strncmp(pcv->currentFname, pcv->a_drv, strlen(pcv->a_drv)))
  387.                         sprintf(buff, "A:%s", doc);
  388.                     else
  389.                         sprintf(buff, "B:%s", doc);
  390.  
  391.                     strcpy(doc,buff);
  392.                 }
  393.                 strcpy(docfname, doc);
  394.                 break;
  395.             case 5:        /*    EXE,CLI        */
  396.             case 6:
  397.                 apartcom(pcv, comPt, command, param, destfname);
  398.                 break;
  399.         }
  400.     }
  401. }
  402.  
  403. int apartcom(ComVal *pcv, char *comPt, char *command, char *param, char *destfname)
  404. /*    EXE,CLIの場合のコマンドの抽出
  405.  *    パイプライン処理の場合は最後のコマンドのみ抽出する。
  406.  */
  407. {
  408.     int i, i1, i2, i3, comlen;
  409.     char buff[90];
  410.  
  411.     param[0] = 0;
  412.     comlen = strlen(comPt);
  413.  
  414.     for(i=comlen;i>0;i--) {
  415.         if (*(comPt + i) == ' ')
  416.             break;
  417.     }
  418.     if (i == 0 || *(comPt + i) == ':') {
  419.         strcpy(command, comPt + i);
  420.         destfname[0] = 0;
  421.     } else {
  422.         i1=i;
  423.         i2=i;
  424.         i3=i;
  425.         for(i=i;i>0;i--) {
  426.             if (*(comPt + i) == ' ')
  427.                 i2=i;
  428.             if (*(comPt + i) == ':' || *(comPt + i - 1) == '|')
  429.                 break;
  430.         }
  431.         if (i == 0) {
  432.             strncpy(command, comPt, i2);
  433.             command[i2] = 0;
  434.         } else if (i2 == i3) {
  435.             strncpy(command, comPt + i, i2 - i);
  436.             command[i2 - i] = 0;
  437.         } else {
  438.             strncpy(command, comPt + i, i2 - i);
  439.             command[i2++ - i] = 0;
  440.             strncpy(param, comPt + i2, i3 - i2);
  441.             param[i3 - i2] = 0;
  442.         }
  443.  
  444.         comPt = comPt + i3 + 1;
  445.         if (*comPt == '\\') {
  446.             if (!strncmp(pcv->currentFname, pcv->a_drv, strlen(pcv->a_drv)))
  447.                 sprintf(buff, "A:%s", comPt);
  448.             else
  449.                 sprintf(buff, "B:%s", comPt);
  450.  
  451.             strcpy(comPt,buff);
  452.         }
  453.         strcpy(destfname, comPt);
  454.     }
  455. }
  456.  
  457. int structfname(ComVal *pcv, char *newpath, char *name, char *newfname)
  458. /*    ファイルネームをカレントパスとnodeから作成する。
  459.  */
  460. {
  461.     char drv[90], path[90], node[90], ext[90];
  462.  
  463.     if (!strncmp(name, "A:", 2)) {
  464.         sprintf(newfname, "%s\\%s", pcv->a_drv, &name[3]);
  465.  
  466.     } else if (!strncmp(name, "B:", 2)){
  467.         sprintf(newfname, "%s\\%s", pcv->b_drv, &name[3]);
  468.  
  469.     } else if (!strncmp(newpath, "A:", 2)) {
  470.         if (newpath[3] == 0) {
  471.             sprintf(newfname, "%s\\%s", pcv->a_drv, name);
  472.         } else {
  473.             sprintf(newfname, "%s\\%s\\%s", pcv->a_drv, &newpath[3], name);
  474.         }
  475.  
  476.     } else if (!strncmp(newpath, "B:", 2)) {
  477.         if (newpath[3] == 0) {
  478.             sprintf(newfname, "%s\\%s", pcv->b_drv, name);
  479.         } else {
  480.             sprintf(newfname, "%s\\%s\\%s", pcv->b_drv, &newpath[3], name);
  481.         }
  482.  
  483.     } else {
  484.         strsfn(pcv->currentPath, drv, path, node, ext);
  485.         if (*newpath != 0)
  486.             sprintf(newfname, "%s%s\\%s\\%s", drv, path, newpath, name);
  487.         else
  488.             sprintf(newfname, "%s%s\\%s", drv, path, name);
  489.     }
  490. }
  491.  
  492. /******************************************************************************
  493.  *    retpastf():    元のテキストをロード
  494.  ******************************************************************************
  495.  *    引数:    ComVal *pcv    共通変数へのポインタ
  496.  */
  497. void retpastf(ComVal *pcv)
  498. {
  499.     int buff;
  500.  
  501.     if (pcv->pastFno < 1)
  502.         return;
  503.  
  504.     buff = pcv->mloadFlag;
  505.     pcv->pastFno = pcv->pastFno - 1;
  506.     strcpy(pcv->currentFname, &(pcv->pastFname[pcv->pastFno][0]));
  507.     strcpy(pcv->currentPath, &(pcv->pastPath[pcv->pastFno][0]));
  508.     GetData(pcv,  pcv->currentFname);
  509.     pcv->mloadFlag = buff;
  510.     pcv->ofset = pcv->pastofset[pcv->pastFno];
  511.     CMValueSet(pcv->volHdl, pcv->ofset);
  512.     drawGraph(pcv, 0);
  513. }
  514.  
  515. STR@3EdEV3.00<@(!%G0JHH     
  516. ハRRT'オヨH vケ > >Ohh$000ヨ=4